#include<iostream>
using namespace std;
//class A
//{
//public:
//	void f()
//	{
//		cout << "A::f()" << endl;
//	}
//};
//class B : public A
//{
//public:
//	virtual void f()
//	{
//		cout << "B::f()" << endl;
//	}
//};
//class A
//{
//public:
//	virtual void func(int val = 1)
//	{
//		cout << "A->" << val << endl;
//	}
//	virtual void test()
//	{
//		func();
//	}
//};
//class B : public A
//{
//	virtual void func(int val = 0)
//	{
//		cout << "B->" << val << endl;
//	}
//};
//class A
//{
//public:
//	virtual void f()
//	{
//		cout << "A::f()" << endl;
//	}
//};
//class B
//{
//public:
//	void f(int val = 0)
//	{
//		cout << "B::f()" << endl;
//	}
//};
//int main()
//{
//	B b;
//	b.f();
//	return 0;
//}
//class A
//{
//public:
//	void foo()
//	{
//		cout << "1" << endl;
//	}
//	virtual void fun()
//	{
//		cout << "2" << endl;
//	}
//};
//class B : public A
//{
//public:
//	void foo()
//	{
//		cout << "3" << endl;
//	}
//	void fun()
//	{
//		cout << "4" << endl;
//	}
//};
//int main()
//{
//	A a;
//	B b;
//	A* p = &a;
//	p->foo();
//	p->fun();
//	p = &b;
//	p->foo();
//	p->fun();
//	A* ptr = (A*)&b;
//	ptr->foo();
//	ptr->fun();
//	return 0;
//}
//class A
//{
//public:
//	A()
//	{
//		printf("A ");
//	}
//	~A()
//	{
//		printf("deA ");
//	}
//};
//class B
//{
//public:
//	B()
//	{
//		cout << "B " << endl;
//	}
//	~B()
//	{
//		cout << "deB " << endl;
//	}
//};
//class C : public A, public B
//{
//public:
//	C()
//	{
//		cout << "C " << endl;
//	}
//	~C()
//	{
//		cout << "deC " << endl;
//	}
//};
//int main()
//{
//	A* a = new C();
//	delete a;
//	return 0;
//}
struct A
{
	void foo()
	{
		cout << "foo";
	}
	virtual void bar()
	{
		cout << "bar";
	}
	A()
	{
		bar();
	}
};
struct B : A
{
	void foo()
	{
		cout << "b_foo";
	}
	void bar()
	{
		cout << "b_bar";
	}
};
int main()
{
	A* p = new B;
	p->foo();
	p->bar();
	return 0;
}